import { createRouter, createWebHashHistory } from "vue-router"
// 引入仓库,取token
import store from "store2"
import useMenus from "@/stores/menus"
// 引入路由文件按需导入
import routers from "./routers"

// 是否添加了路由
let isAdd = false

const router = createRouter({
  history: createWebHashHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: "/",
      name: "root",
      component: () => import("@/views/root.vue"),
      redirect: "/sys/user",
      children: []
    },
    {
      path: "/login",
      name: "login",
      component: () => import("@/views/login.vue"),
      meta: {
        allAgree: true
      }
    }
  ]
})

// 前置守卫
router.beforeEach(async (to, from) => {
  // 如果路由的meta中有allAgree,直接放行
  if (to.meta.allAgree) return true

  // 即将跳转时,先判断有无token,无token就直接跳转到登录路由
  if (!store.get("token")) {
    return { name: "login", replace: true }
  }

  // 如果没有添加路由,此时开始添加路由
  if (!isAdd) {
    addRouters(to)
  }
})

// 动态添加路由
async function addRouters(to: any) {
  // 获取仓库中的菜单
  const menusStore = useMenus()

  // 调用仓库中的方法, 获取权限菜单
  const menus: menusType[] = (await menusStore.getMenus()) as any

  // 过滤出菜单类型,准备创建路由
  // 过滤条件isShow为1且type为2
  const routerUrl = menus
    .filter((res) => res.isShow && res.type === 1)
    .map((res) => res.router)

  // 获取的是键名为文件路径,键值为一个按需导入的函数 ()=>import("./../../")
  let keys: string[] = Object.keys(routers)

  // 处理keys数组
  let keysStr = keys.map((res) => {
    // 将key前面的views和后面的.vue截除
    res = res.slice(8)
    res = res.slice(0, -4)
    return res
  })

  routerUrl.forEach((res) => {
    // 动态添加路由
    // 找到此路径对应要引入哪一条路由
    const index = keysStr.findIndex((item) => res === item)
    if (index == -1) return

    // 添加路由
    router.addRoute("root", {
      name: keysStr[index],
      path: keysStr[index],
      component: routers[keys[index]]
    })
  })

  // 动态添加404页面
  router.addRoute({
    path: "/:pathMatch(.*)*",
    name: "404",
    component: () => import("@/views/err/404.vue")
  })

  // 添加路由完毕
  isAdd = true
  // 重新定位
  router.replace({ ...to })
}

export default router
